package modulebll

import (
	"fmt"

	"7qule.com/sd3/CrossServer/src/bll/world"
	"7qule.com/sd3/CrossServer/src/common/onlinelog"
	"7qule.com/sd3/CrossServer/src/dal"
	"7qule.com/sd3/CrossServer/src/model/module"
	"public.com/goutil/debugUtil"
)

var (
	moduleData = make(map[string]*module.Module)
)

func init() {
	// 注册重新加载的方法
	world.LoadMgr.RegisterFunc("modulebll.moduleList", load)
}

// 重新加载模块定义
func load() (errList []error) {
	var moduleList []*module.Module

	err := dal.GetAll(&moduleList)
	if err != nil {
		errList = append(errList, err)
		return
	}

	// 获取所有模块定义
	neededModuleAlias := GetAllModuleAlias()

	// 获取需要的模块定义
	resultModuleData := make(map[string]*module.Module, 8)
	for _, moduleObj := range moduleList {
		// 查看是否需要此项模块
		_, ifExist := neededModuleAlias[moduleObj.Alias]
		if ifExist {
			resultModuleData[moduleObj.Alias] = moduleObj
		}
	}

	// 确认是否所有需要的模块都已经被加载了
	for _, alias := range neededModuleAlias {
		moduleItem, isExist := resultModuleData[alias]
		if isExist == false {
			onlinelog.ErrorLog(fmt.Sprintf("未找到模块定义:%v,将默认关闭此模块", alias))
		} else {
			debugUtil.Printf("%v:%v\n", alias, moduleItem)
		}
	}

	moduleData = resultModuleData

	return
}

// 根据Id获取模块对象
// id:模块Id
// 返回值：
// 模块对象
// 是否存在
func GetModuleById(id int) (*module.Module, bool) {
	for _, val := range moduleData {
		if val.Id == id {
			return val, true
		}
	}

	return nil, false
}

// 根据Id获取模块对象
// moduleName:模块名
// 返回值：
// 模块对象
// 是否存在
func GetModule(moduleName string) (*module.Module, bool) {
	result, isExist := moduleData[moduleName]
	return result, isExist
}

// 检查模块是否开启
// moduleName:模块名
// 返回值:
// bool:模块是否开启
func CheckIfModuleOpen(moduleName string) bool {
	moduleItem, ifExist := GetModule(moduleName)
	if ifExist == false {
		return false
	}

	if string(moduleItem.IfOpen) == "0" {
		return false
	}

	return true
}

// 检查模块是否开启
// id:模块Id
// 返回值:
// bool:模块是否开启
func CheckIfModuleOpenById(id int) bool {
	moduleItem, ifExist := GetModuleById(id)
	if ifExist == false {
		return false
	}

	if string(moduleItem.IfOpen) == "0" {
		return false
	}

	return true
}
